//----------------------------------------------------------------------------
//  ,-.
// /_\___ ,   CA Framework
// '  ___\    (C) Riccardo Capra - http://riccar.do
//  //   \\
//----------------------------------------------------------------------------
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//----------------------------------------------------------------------------

#ifndef NJ_LOCKLESS_RAND_GENERATOR_H
#	define NJ_LOCKLESS_RAND_GENERATOR_H

#	include "NjExample01.h"

	/// \brief Implements a simple lockless multiply with carry random generator
	class NjLocklessRandGenerator
	{
	public:
		/// \brief The maximum value that can be returned by the generator
		static const NjUint MAX_RAND = NJ_MAX_UINT;

		/// \brief Returns the current seed
		static NjUint GetSeed();

		/// \brief Sets the random generator seed
		static void SetSeed(NjUint uSeed);

		/// \brief Gets the next number of the sequence
		static NjUint Next();

	private:
		/// \brief Internal private implementation
		class Static;

		NJ_DISABLE_INSTANCE(NjLocklessRandGenerator);
	};

#endif // NJ_RAND_UINT_H
